<!DOCTYPE html>
<style>
.transitionTest {
    background-color: green;
    height: 100px;
    transition: all 1s linear;
    -moz-transition: all 1s linear;
}

#startCalcEndCalc, #startCalcEndPx, #startCalcEndPercent {
    width: calc(10% + 50px);
    width: -moz-calc(10% + 50px);
}

#startPxEndCalc {
    width: 100px;
}

#startPercentEndCalc {
    width: 20%;
}

#startCalcEndCalc.go, #startPxEndCalc.go, #startPercentEndCalc.go {
    width: calc(100% - 100px);
    width: -moz-calc(100% - 100px);
}

#startCalcEndPx.go {
    width: 400px;
}

#startCalcEndPercent.go {
    width: 80%;
}
</style>

This tests that transitions containing calc() expressions transition correctly.
<div style="width:500px; border: 1px solid black;">
    <div class="transitionTest" id="startCalcEndCalc"></div>
    <div class="transitionTest" id="startPxEndCalc"></div>
    <div class="transitionTest" id="startPercentEndCalc"></div>
    <div class="transitionTest" id="startCalcEndPx"></div>
    <div class="transitionTest" id="startCalcEndPercent"></div>
</div>
<div id="result"></div>

<script src="../../animations/resources/animation-test-helpers.js"></script>
<script>

const tests = ["startCalcEndCalc", "startPxEndCalc", "startPercentEndCalc", "startCalcEndPx", "startCalcEndPercent"];

expectedValues = [];

for (var i = 0; i < tests.length; i++) {
    expectedValues = expectedValues.concat([[0.25, tests[i], 'width', 175, 2]]);
    expectedValues = expectedValues.concat([[0.5, tests[i], 'width', 250, 2]]);
    expectedValues = expectedValues.concat([[0.75, tests[i], 'width', 325, 2]]);
    expectedValues = expectedValues.concat([[1.0, tests[i], 'width', 400, 2]]);
}

function initialize(id)
{
    var expectedStartWidth = 100;
    var element = document.getElementById(id);
    var width = element.offsetWidth;
    if (width == expectedStartWidth)
        result += 'PASS - "width" property for "' + id +'" element at 0.0s was: ' + width + '<br>';
    else
        result += 'FAIL  - "width" property for "' + id +'" element at 0.0s expected: ' + expectedStartWidth + ' but saw: ' + width + '<br>';
    
    element.className += " go";
}

function setupTest()
{
    for (var i = 0; i < tests.length; i++)
        initialize(tests[i]);
}

runTransitionTest(expectedValues, setupTest, undefined, false /* pixel test */);

</script>
